<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
 <HEAD>
  <TITLE>初步认识jsp</TITLE>
  <META NAME="Generator" CONTENT="EditPlus">
  <META NAME="Author" CONTENT="">
  <META NAME="Keywords" CONTENT="">
  <META NAME="Description" CONTENT="">
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <style type="text/css">
	*{margin: 0px;padding:10px}
	a{text-decoration:none;color:black;margin: 0px;padding:0px;}
	.a1{text-decoration:underline;color:blue;}
	.font4{font-size:20px}
	p{margin: 0px;padding:0px;margin-top: 10px}
	td{margin: 0px;padding:0px;}
	.p1{margin-left: 20px}
	.p2{margin-left: 40px}
	.p3{margin-left: 60px}
	.p4{margin-left: 80px}
	.spdp{display:none;margin: 0px;padding:0px}
	.pre1{background-color:#E6E6E6;width:300px;margin-left: 50px;padding:0px}
  </style>
  <script type="text/javascript">
	function spdp(val){
		var sp=getStyle(document.getElementById(val),"display");
		if("none"==sp){
			document.getElementById(val).style.display="block";
		}else{
			document.getElementById(val).style.display="none";
		}
	}
	function getStyle( elem, name )  {  
		//如果该属性存在于style[]中，则它最近被设置过(且就是当前的)  
		if(elem.style[name]){  
			return elem.style[name];  
		}else if(elem.currentStyle){//否则，尝试IE的方式    
			return elem.currentStyle[name];  
		}else if(document.defaultView && document.defaultView.getComputedStyle){//或者W3C的方法，如果存在的话
			//它使用传统的"text-Align"风格的规则书写方式，而不是"textAlign"  
			name = name.replace(/([A-Z])/g,"-$1");  
			name = name.toLowerCase();  
			//获取style对象并取得属性的值(如果存在的话)  
			var s = document.defaultView.getComputedStyle(elem,"");  
			return s && s.getPropertyValue(name);  
			//否则，就是在使用其它的浏览器 
		}else{
			return null;
		}  
	} 
  </script>
 </HEAD>

 <BODY>
	<center><font size=6>初步认识jsp</font></center></br></br>
	<p>一，<a href="#text1">JSP简介</a></p>
	<p>二，<a href="javascript:void(0);" onclick="spdp('sp1')">jsp运行环境的搭建</a></p>
	<span id="sp1" class="spdp"><p class="p1">1,<a href="#text2-1">Java环境的安装</a></p><p class="p1">2,<a href="#text2-2">安装和配置WEB服务器</a></p>
	<p class="p1">3,<a href="#text2-3">安装和配置Eclipse</a></p><p class="p1">4,<a href="#text2-4">jsp安装环境测试</a></p></span>
	<p>三，<a href="javascript:void(0);" onclick="spdp('sp2')">JSP语法介绍</a></p>
	<span id="sp2" class="spdp"><p class="p1">1,<a href="#text3-1">JSP页面的基本结构</a></p><p class="p1">2,<a href="#text3-2">JSP注释</a></p><p class="p1">3,<a href="#text3-3">JSP脚本元素</a></p><p class="p1">4,<a href="#text3-4">JSP指令</a></p>
	<p class="p1">5,<a href="javascript:void(0);" onclick="spdp('sp2-1')">JSP内置对象</a></p><span id="sp2-1" class="spdp"><p class="p2">(1)<a href="#text3-5-1">Request对象</a></p><p class="p2">(2)<a href="#text3-5-2">Response对象</a></p><p class="p2">(3)<a href="#text3-5-3">Session对象</a></p><p class="p2">(4)<a href="#text3-5-4">Application对象</a></p><p class="p2">(5)<a href="#text3-5-5">Config对象</a></p><p class="p2">(6)<a href="#text3-5-6">Exception对象</a></p><p class="p2">(7)<a href="#text3-5-7">Out对象</a></p><p class="p2">(8)<a href="#text3-5-8">Page对象</a></p><p class="p2">(9)<a href="#text3-5-9">PageContext对象</a></p></span>
	<p class="p1">6,<a href="#text3-6">JSP动作</a></p></span>
	<p>四，<a href="javascript:void(0);" onclick="spdp('sp4')">JSP自定义标签</a><span id="sp4" class="spdp"><p class="p1">1,<a href="#text4-1">JSP自定义标签介绍</a></p><p class="p1">2,<a href="#text4-2">自定义一个用表格显示用户信息的简单标签</a></p><p class="p1">3,<a href="#text4-3">开发带标签体的标签</a></p><p class="p1">4,<a href="#text4-4">开发迭代的标签</a></p><p class="p1">5,<a href="#text4-5">自定义的函数库</a></p></span></p>
	<p>五，<a href="#text5">网页错误代码</a>
	<br><br>
	<p><strong class="font4">一，jsp简介</strong><a name="text1"></a></p>
	<p class="p1">jsp是sun公司倡导的，多家公司参与建立的一种web动态技术标准。它是在传统HTML代码中加入java程序段（scriptlet）和jsp标记，实现建立动态网站所需要的功能。Jsp的所有程序操作都在服务器端进行，传送给客户端的只是得到的结果。</p>
	<p class="p1">Jsp是一个简化的servlert，主要用来提取数据和网页设计的显示，它可以通过jsp标记和scriptlet来访问存在于服务器端的应用逻辑。</p>
	</br>
	<p><strong class="font4">二，jsp运行环境的搭建</strong></a></p>
	<p class="p1"><a name="text2-1"></a>JSP是基于Java技术的，所以配置JSP环境之前必须要安装JDK，JDK是Sun公司免费提供的Java开发工具，它包含了Java开发中必需的开发工具和运行环境，可以在oracle公司的网站上免费下载。</p>
	<p class="p2">1,下载JDK:<a class="a1" href="http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html">下载地址</a></p>
	<p class="p2">2,安装JDK，目录可以改变，不过我们要记住JDK的安装路径，方便下步环境变量的配置。</p>
	<p class="p2">3,设置JDK环境变量</p>
	<p class="p3">3-1，在桌面上右键单击"我的电脑"图标，在弹出的快捷菜单中选择"属性"，打开"系统"窗口，单击"高级系统设置"，打开"系统属性"窗口，再单击"环境变量"按钮。</p>
	<p class="p3">3-2，打开环境变量窗口后，新建个JAVA_HOME的系统变量，值为"C:\Program Files\Java\jdk1.6.0_43"（这个是JDK的安装路径）。</p>
	<p class="p3">3-3，按同样的方法新建一个名为CLASSPATH的系统变量，值为".;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;"。</p>
	<p class="p3">3-4，修改系统变量PATH，添加值";%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin"。现在我们完成了JDK的配置。</p>
	<p class="p1"><a name="text2-2"></a>安装和配置WEB服务器:Tomcat是一个可以运行jsp和Servlet，基于Java和Web技术的容器，可以提供jsp的解析，也可以当做独立的服务器用。</p>
	<p class="p2">1，下载Tomcat：<a class="a1" href="http://tomcat.apache.org/download-70.cgi">下载地址</a></p>
	<p class="p2">2，安装Tomcat，安装的时候一般默认就可以了。</p>
	<p class="p2">3，安装Tomcat后，打开Tomcat安装文件夹下的bin文件夹，找到startup.bat文件，双击它启动Tomcat。</p>
	<p class="p2">4，打开浏览器，在地址栏输入"http://localhost:8080/"后，没有报404网页错误，那么代表Tomcat安装成功。</p>
	<p class="p2">5，最后来了解一下Tomcat的目录结构：</p>
	<p class="p3">5-1，/bin :Tomcat的系统文件存放</p>
	<p class="p3">5-2，/conf :Tomcat的配置文件存放</p>
	<p class="p3">5-3，/lib :存放各种jar文件和类文件，能被各目录下的jsp页面和Tomcat服务器系统程序访问。</p>
	<p class="p3">5-4，/logs :存放服务器日志文件</p>
	<p class="p3">5-5，/temp :存放服务器的各种临时文件</p>
	<p class="p3">5-6，/webapps :存放web工程</p>
	<p class="p3">5-7，/work :存放jsp页面转换的servlet文件和字节码文件</p>
	<p class="p1"><a name="text2-3"></a>安装和配置Eclipse：Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言，它只是一个框架和一组服务，用于通过插件组件构建开发环境。</p>
	<p class="p2">1，下载Eclipse：<a class="a1" href="http://www.eclipse.org/downloads/index.php">下载地址</a>（最好选择 Eclipse IDE for Java EE Developers下载，这样配置Eclipse很简单）</p>
	<p class="p2">2，安装Eclipse，eclipse的安装倒是很简单，只要解压就行。</p>
	<p class="p2">3，配置Eclipse，如果下载的是Eclipse IDE for Java EE Developers，那只要配置下工作空间的编码，各个文件的编码和Tomcat服务器。</p>
	<p class="p3">3-1，配置工作空间编码：windows-->Preferences-->General-->workspace-->Text file encoding-->other-->utf-8</p>
	<p class="p3">3-2，配置文件编码：windows-->Preferences-->General-->content Types 选择下面的文件修改编码。</p>
	<p class="p3">3-3，配置Tomcat服务器：windows-->Preferences-->server-->runtime environments-->add</p>
	<p class="p3">3-4，打开new Server Runtime Environments窗口后选择Tomcat服务器的版本，点next</p>
	<p class="p3">3-5，Name里是输入服务器名称的，Tomcat installation directory里是配置Tomcat服务器地址的，JRE里是选择jdk版本的</p>
	<p class="p1"><a name="text2-4"></a>安装完Eclipse以后就需要对jsp安装环境进行测试：</p>
	<p class="p2">1，打开Eclipse后会弹出一个Workspace Launcher窗口，这里可以设置工作空间。 </p>
	<p class="p2">2，Eclipse进去后新建一个web动态工程：file-->new-->Dynamic Web Project</p>
	<p class="p2">3，打开New Dynamic Web Project窗口后，在Project name这里填上工程名然后next-->next-->finish,这样一个web工程就创建好了。</p>
	<p class="p2">4，建好工程后打开工程右键WebContent：new-->JSP File,打开New JSP File窗口，在File name里填上JSP文件名然后点击finish，这样就在工程中新建一个JSP文件。</p>
	<p class="p2">5，打开新建的JSP文件在&lt;body&gt;&lt;/body&gt;之间输入Hello World，然后保存。</p>
	<p class="p2">6，右键工程（工程名）：Run As-->Run on Server，打开Run On Server的窗口选择配好的服务器：next-->finish，这样就把工程加到Tomcat中去了。</p>
	<p class="p2">7，打开浏览器，在地址栏输入"http://localhost:8080/helloworld（这里输入你的工程名）/helloworld.jsp（这里输入你要展现的JSP文件名）"，如果浏览器页面出现Hello World，那代表测试成功。</p>
	</br>
	<p><strong class="font4">三，JSP语法介绍</strong></a></p>
	<p class="p1"><a name="text3-1"></a>一，JSP页面的基本结构</p>
	<p class="p2">一个JSP页面主要由标记，注释，指令，脚本元素，动作元素等内容组成，JSP基本结构如下：</a></p>
	<p class="p3">标记：HTML标记，JSP标记</p>
	<p class="p3">注释：HTML注释，JSP注释</p>
	<p class="p3">指令：page，include，taglib</p>
	<p class="p3">脚本元素：变量声明，方法声明，表达式</p>
	<p class="p3">内置对象：request，response，session等</p>
	<p class="p3">动作元素：include，usebean，forward等</p>
	<p class="p3">自定义标签：tld，tag</p>
	<p class="p2">JSP结构示例:</p>
	<p class="p3"><pre class="pre1">
&lt;!-- page指令：定义与JSP页面相关的属性 --&gt;
&lt;%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %&gt;
&lt;%@page  import="java.util.*" %&gt;
&lt;!-- include指令：定义JSP页面需要插入的资源 --&gt;
&lt;%@include file="New2.jsp" %&gt;
&lt;!-- taglib指令：定义JSP页面可以调用的资源 --&gt;
&lt;%@taglib prefix="ntg" uri="http://www.meiyigou.com/tags/new"%&gt;
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
&lt;title&gt;Insert title here&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;%!String showDate(){//声明方法
		String nowData;//声明变量
		nowData=new Date().toString();
		return nowData;
	} %&gt;
	&lt;% 	int num=0; 
		for(int i=1;i&lt;=100;i++){
			num+=i;
		}
	%&gt;
	现在时间为:&lt;%=showDate() %&gt;
	1--100相加为：&lt;%=num %&gt;
	Hello World
&lt;/body&gt;
&lt;/html&gt;</pre></p>
	<p class="p1"><a name="text3-2"></a>二，JSP注释</p>
	<p class="p2">1，JSP隐藏注释</p>
	<p class="p3">JSP隐藏注释用于描述JSP程序代码，它不会被JSP引擎处理，也不会在客户端的WEB浏览器中显示。示例如下：</p>
	<p class="p3"><pre class="pre1">	&lt;%--注释文本--%&gt;</pre></p>
	<p class="p2">2，HTML注释</p>
	<p class="p3">HTML注释用于客户端动态的显示一个注释信息，即该注释可以在浏览器源文件窗口看到。示例如下：</p>
	<p class="p3"><pre class="pre1">	&lt;!--注释文本--&gt;</pre></p>
	<p class="p2">3，Java注释</p>
	<p class="p3">JSP作为基于Java的脚本语言，可以遵循Java语言本身的注释规则对程序代码就行注释，Java注释不会在客户端显示注释信息。</p>
	<p class="p3">示例1：</p>
	<p class="p3"><pre class="pre1">	&lt;%/*注释文本*/%&gt;</pre></p>
	<p class="p3">示例2：</p>
	<p class="p3"><pre class="pre1">	&lt;%int num=0;//注释文本%&gt;</pre></p>
	<p class="p3">示例3：</p>
	<p class="p3"><pre class="pre1">
	&lt;%/**注释文本
	注释文本
	注释文本**/%&gt;</pre></p>
	<p class="p1"><a name="text3-3"></a>三，JSP脚本元素（scriptlet）</p>
	<p class="p2">JSP作为基于Java的脚本语言，可以遵循Java语言本身的语法规则，来使用变量，方法和表达式，当然JSP也有自己的语法规则。JSP有3种方式来使用变量，方法和表达式</p>
	<p class="p2">1，声明标签</p>
	<p class="p3">声明标签可以声明变量和方法。</p>
	<p class="p3">声明变量示例：</p>
	<p class="p3"><pre class="pre1">	&lt;%!int num;%&gt;</pre></p>
	<p class="p3">声明方法示例：</p>
	<p class="p3"><pre class="pre1">&lt;%!String showDate(){
	String nowData;
	nowData=new Date().toString();
	return nowData;
} %&gt;</pre></p>
	<p class="p2">2，脚本标签</p>
	<p class="p3">脚本标签可以声明变量，不能声明方法，可以运行逻辑。示例如下：</p>
	<p class="p3"><pre class="pre1">&lt;% 	int num=0; 
	for(int i=1;i&lt;=100;i++){
		num+=i;
	}
%&gt;</pre></p>
	<p class="p2">3，表达式标签</p>
	<p class="p3">表达式标签只能输出结果不可以声明变量和方法，不能运行逻辑。示例如下：</p>
	<p class="p3"><pre class="pre1">	&lt;%=num %&gt;</pre></p>
	<p class="p1"><a name="text3-4"></a>四，JSP指令</p>
	<p class="p2">JSP指令用于JSP文件所能执行的Java语句的控制信息，对JSP页面进行全局或局部的控制。JSP定义了以下3种不同的指令。</p>
	<p class="p2">1，page指令</p>
	<p class="p3">page指令用来定义JSP文件页面的全局信息，用于设置JSP页面的全局属性，其作用域为JSP页面和其包含的文件。示例如下：</p>
	<p class="p3"><pre class="pre1">
&lt;%@ page language="java"
	 contentType="text/html; charset=utf-8" 
	 pageEncoding="utf-8" 
	 import="java.util.*" 
	 autoFlush="true|false" 
	 buffer="8kb|none" 
	 deferredSyntaxAllowedAsLiteral="false|true" 
	 errorPage="New2.jsp"
	 isErrorPage="false|true"
	 extends="package.class" 
	 info="测试" 
	 isELIgnored="false|true" 
	 isThreadSafe="true|false" 
	 session="true|false" 
	 trimDirectiveWhitespaces="false|true" %&gt;</pre></p>
	 <p class="p3">使用page指令应该注意下面几个方面：1，page指令的作用范围为整个JSP页面。2，page指令可以放在JSP页面的任何位置，通常放在JSP页面的开始。3，可以在一个JSP页面使用多个page指令，但只有import属性可以使用多次。4，JSP指令不能作用于动态的包含文件，如&lt;jsp: include&gt;。</p>
	 <p class="p3">下面介绍page指令属性的含义和用法：</p>
	 <p class="p3"><b>1.language</b></p>
	 <p class="p4">language属性定义了JSP页面中所使用的脚本语言。使用该属性应该注意的是它必须设置在JSP第一次出现脚本元素之前，否则会导致严重错误。</p>
	 <p class="p3"><b>2.contentType</b></p>
	 <p class="p4">contentType属性定义了JSP页面的字符编码和JSP页面响应的MIME类型。默认MIME类型为text/html，默认字符集为ISO-8859-1。</p>
	 <p class="p3"><b>3.pageEncoding</b></p>
	 <p class="p4">pageEncoding属性定义了JSP页面的字符编码。默认字符集为ISO-8859-1。</p>
	 <p class="p3"><b>4.import</b></p>
	 <p class="p4">import属性可以导入JSP页面脚本环境所需要的类。</p>
	 <p class="p3"><b>5.buffer</b></p>
	 <p class="p4">buffer属性设置JSP网页的缓冲区大小。默认为8KB，设置为none时，表示不缓冲。所有响应通过ServlertResponse的PrintWriter输出。</p>
	 <p class="p3"><b>6.autoFlush</b></p>
	 <p class="p4">autoFlus属性设置JSP网页的缓冲区是否自动刷新。默认为true，表示当缓冲区满时到客户端的输出将刷新，若为false，表示当缓冲区满时将会出现缓冲区溢出异常。如果buffer为none，autoFlush不能设置为false。</p>
	 <p class="p3"><b>7.deferredSyntaxAllowedAsLiteral</b></p>
	 <p class="p4">deferredSyntaxAllowedAsLiteral属性指示在JSP页面的模板文本中是否允许出现字符序列#{}。默认为false。</p>
	 <p class="p3"><b>8.errorPage</b></p>
	 <p class="p4">errorPage属性设置JSP页面发生异常时调用的JSP页面。该属性默认为空，即忽略错误信息页面</p>
	 <p class="p3"><b>9.isErrorPage</b></p>
	 <p class="p4">isErrorPage属性设置JSP页面是否为错误处理页面，即当用前页面能否被另一个JSP页面用errorPage调用。该属性默认为false。</p>
	 <p class="p3"><b>10.extends</b></p>
	 <p class="p4">extends属性表明JSP编译时需要加入的Java Class的全名。</p>
	 <p class="p3"><b>11.info</b></p>
	 <p class="p4">info属性设置页面的文本信息。</p>
	 <p class="p3"><b>12.isELIgnored</b></p>
	 <p class="p4">isELIgnored属性用来设置JSP页面的EL表达式语言是否被忽略。默认为false</p>
	 <p class="p3"><b>13.isThreadSafe</b></p>
	 <p class="p4">isThreadSafe属性设置JSP页面是否支持使用线程。默认为true，表示在运行JSP页面时会同时接受多个客户的请求，如设置为false，那么JSP页面会逐个接受客户的请求。</p>
	 <p class="p3"><b>13.session</b></p>
	 <p class="p4">session属性指定JSP页面是否参与一个HTTP会话。默认为true。</p>
	 <p class="p3"><b>14.trimDirectiveWhitespaces</b></p>
	 <p class="p4">trimDirectiveWhitespaces属性设置JSP引擎输出的HTML文件去除多余的空行。默认为false。</p>
	 <p class="p2">2，include指令</p>
	 <p class="p3">include指令用来指定JSP页面需要插入的资源，可以是文本、代码、HTML或JSP文件，所包含的文件必须是静态文件不能包含动态文件。示例如下：</p>
	 <p class="p3"><pre class="pre1">    &lt;%@include file="New2.jsp" %&gt;</pre></p>
	 <p class="p2">3，taglib指令</p>
	 <p class="p3">taglib指令用来定义一个标签库和自定义标签的前缀，可以把一些需要重复显示的内容自定义为一个标签。示例如下：</p>
	 <p class="p3"><pre class="pre1">&lt;%@taglib prefix="ntg" uri="http://www.meiyigou.com/tags/new"%&gt;</pre></p>
	 <p class="p3"><a href="#">详情请看自定义标签目录</a></p>
	 <p class="p1"><a name="text3-5"></a>五，JSP内置对象</p>
	 <p class="p2">为了方便Web页面的开发，JSP提供了一些内置的对象，这些对象不需要事先声明便可使用。JSP有九大内置对象：request、response、session、out、application、config、pagecontext、page。通过这些内置对象可以实现页面的一些基本请求输入、输出和数据的交互。下面介绍这些对象。</p>
	 <p class="p2"><a name="#text3-5-1"></a>1，Request对象</p>
	 <p class="p2">Request对象封装了客户端的请求数据信息，包括客户提交的信息和客户端的一些信息。Request对象的常用方法如下。</p>
	 <p class="p3">（1）getCookies()</p>
	 <p class="p3">该方法用于获得客户端的Cookies对象，返回值为一个Cookies对象。示例：</p>
	 <p class="p3"><pre class="pre1">    &lt;%Cookie[] cookies= request.getCookies(); %&gt;</pre></p>
	 <p class="p3">（2）setAttribute(String name,Object object)，getAttribute(String name)和removeAttribute(String name)</p>
	 <p class="p3">setAttribute方法用于设置名字为name的Request对象的参数值。getAttribute方法返回name字符串指定的Request对象的参数值，如果不存在这个属性就返回null。removeAttribute方法移除指定名字的Request对象的参数值。示例：</p>
	 <p class="p3"><pre class="pre1">	&lt;%request.setAttribute("new", "hello");
	Object object=request.getAttribute("new");
	request.removeAttribute("new");%&gt;</pre></p>
	<p class="p3">（3）getAttributeNames()</p>
	<p class="p3">该方法用于返回Request对象的所有属性的名字，结果集是一个枚举类Enumeration的实例。示例：</p>
	<p class="p3"><pre class="pre1">    &lt;% Enumeration&lt;String&gt; enumeration= request.getAttributeNames(); %&gt;</pre></p>
	<p class="p3">（4）getSession()</p>
	<p class="p3">该方法用于返回客户端请求相关的HttpSession对象。示例：</p>
	<p class="p3"><pre class="pre1">    &lt;% HttpSession httpSession= request.getSession(); %&gt;</pre></p>
	<p class="p3">（5）getHeader(String name)</p>
	<p class="p3">该方法用于返回指定名字的HTTP协议定义的传送文件的文件头信息。示例：</p>
	<p class="p3"><pre class="pre1">    &lt;%  String s=request.getHeader("host"); %&gt;</pre></p>
	<p class="p3">（6）getHeaderNames()</p>
	<p class="p3">该方法用于返回所有HTTP协议定义的传送文件头信息的名字，结果集是一个枚举类Enumeration的实例。示例：</p>
	<p class="p3"><pre class="pre1">    &lt;% Enumeration<String> enumeration= request.getHeaderNames(); %&gt;</pre></p>
	<p class="p3">获取所有头信息名字示例：</p>
	<p class="p3"><pre class="pre1">
	&lt;% while(enumeration.hasMoreElements()){
	   out.print(enumeration.nextElement()+"&lt;/br&gt;");
	};%&gt;</pre></p>
	<p class="p3">（7）getHeaderNames()</p>
	<p class="p3">该方法用于返回所有HTTP协议定义的传送文件头信息的名字，结果集是一个枚举类Enumeration的实例。示例：</p>
	<p class="p3"><pre class="pre1">    &lt;% Enumeration<String> enumeration= request.getHeaderNames(); %&gt;</pre></p>
	<p class="p3">（8）getMethod()</p>
	<p class="p3">该方法用于返回客户端向服务器传送数据的方法，如get或post。示例：</p>
	<p class="p3"><pre class="pre1">    &lt;% String txt= request.getMethod(); %&gt;</pre></p>
	<p class="p3">（9）getParameter(String name)</p>
	<p class="p3">该方法用于返回客户端传送给服务器端的指定名字的参数值，如果指定的参数名不存在就返回null。示例：</p>
	<p class="p3"><pre class="pre1">
	&lt;form action="index.jsp" method="post"&gt;
		&lt;input type="text" name="name"&gt;
		&lt;input type="submit" value="提交"&gt;
	&lt;/form&gt;
	&lt;% String txt= request.getParameter("name"); %&gt;
	&lt;%=txt %&gt;</pre></p>
	<p class="p3">（10）getParameterNames()</p>
	<p class="p3">该方法用于返回客户端传送给服务器端的所有参数名，结果集是一个枚举类Enumeration的实例。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Enumeration&lt;String&gt; enu= request.getParameterNames(); %&gt;</pre></p>
	<p class="p3">（11）getParameterValues(String name)</p>
	<p class="p3">该方法用于返回客户端传送给服务器端指定名字的所有参数，返回值是一个字符串数组。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String[] txt= request.getParameterValues("name"); %&gt;</pre></p>
	<p class="p3">（12）getParameterMap()</p>
	<p class="p3">该方法用于返回客户端传送给服务器端的所有参数，返回值是一个Map。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Map&lt;String,String[]&gt; maps= request.getParameterMap();%&gt;</pre></p>
	<p class="p3">（13）getQueryString()</p>
	<p class="p3">该方法用于返回查询字符串，该字符串是客户端浏览器以GET方法向服务器传送的。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getQueryString();%&gt;</pre></p>
	<p class="p3">（14）getRequestURL()和getRequestURI()</p>
	<p class="p3">getRequestURL方法用于返回发出请求字符串的客户端地址，getRequestURI方法用于返回包含工程名的当前页面全路径。示例：</p>
	<p class="p3"><pre class="pre1">&lt;StringBuffer buffer= request.getRequestURL();
	String txt=request.getRequestURI();&gt;</pre></p>
	<p class="p3">（15）getServletPath()</p>
	<p class="p3">该方法用于得到当前页面所在目录下全名称。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getServletPath();%&gt;</pre></p>
	<p class="p3">（16）getRealPath(String name)</p>
	<p class="p3">该方法用于得到指定名字页面在所在服务器的全路径。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getRealPath("index.jsp");%&gt;</pre></p>
	<p class="p3">（17）getServerName()</p>
	<p class="p3">该方法用于返回服务器的名称，如果没有设定服务器名，则返回服务器的IP地址。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getServerName();%&gt;</pre></p>
	<p class="p3">（18）getServerPort()</p>
	<p class="p3">该方法用于返回服务器的端口号。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% int i= request.getServerPort();%&gt;</pre></p>
	<p class="p3">（19）getRemoteAddr()</p>
	<p class="p3">该方法用于返回客户端的IP地址。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getRemoteAddr();%&gt;</pre></p>
	<p class="p3">（20）getRemoteAddr()</p>
	<p class="p3">该方法用于返回客户端主机的名字。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getRemoteHost();%&gt;</pre></p>
	<p class="p3">（21）getRemoteUser()</p>
	<p class="p3">该方法用于返回客户登录服务器后的用户名。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getRemoteUser();%&gt;</pre></p>
	<p class="p3">（22）getRemotePort()</p>
	<p class="p3">该方法用于返回客户机访问服务器所用的网络端口。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% int txt=request.getRemotePort();%&gt;</pre></p>
	<p class="p3">（23）getProtocol()</p>
	<p class="p3">该方法用于返回客户机向服务器传送数据的协议名称。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getProtocol();%&gt;</pre></p>
	<p class="p3">（24）getContentLength()</p>
	<p class="p3">该方法用于返回以字节为单位的客户端请求数据的大小，如果无法获得数据则返回-1。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% int txt=request.getContentLength();%&gt;</pre></p>
	<p class="p3">（25）getContentType()</p>
	<p class="p3">该方法用于返回客户端请求的MIME类型，如果无法获得数据则返回-1。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getContentType();%&gt;</pre></p>
	<p class="p3">（26）getContextPath()</p>
	<p class="p3">该方法用于返回服务器的根路径，即工程的名字。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getContextPath();%&gt;</pre></p>
	<p class="p3">（27）getLocalAddr()</p>
	<p class="p3">该方法用于返回节点本地IP。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getLocalAddr();%&gt;</pre></p>
	<p class="p3">（28）getLocalPort()</p>
	<p class="p3">该方法用于返回节点本地端口。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% int txt=request.getLocalPort();%&gt;</pre></p>
	<p class="p3">（29）getLocalName()</p>
	<p class="p3">该方法用于返回节点本地名称。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=request.getLocalName();%&gt;</pre></p>
	<p class="p3">（30）getLocale()</p>
	<p class="p3">该方法用于返回节点本地浏览器设置。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Locale txt= request.getLocale();%&gt;</pre></p>
	<p class="p3">（31）getLocales()</p>
	<p class="p3">该方法用于返回节点本地所有设置。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Enumeration&lt;Locale&gt; txt= request.getLocales();%&gt;</pre></p>
	<p class="p3">（32）getInputStream()</p>
	<p class="p3">该方法用于返回客户端请求的输入流。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% InputStream inputStream= request.getInputStream();%&gt;</pre></p>
	<p class="p3">（33）getCharacterEncoding()</p>
	<p class="p3">该方法用于返回字符编码方式。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt= request.getCharacterEncoding();%&gt;</pre></p>
	<p class="p3">（34）setCharacterEncoding(String name)</p>
	<p class="p3">该方法用于设置字符编码方式。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% request.setCharacterEncoding("utf-8");%&gt;</pre></p>
	<p class="p2"><a name="#text3-5-2"></a>2，Response对象</p>
	<p class="p2">Response对象用来对客户的请求做出响应，用于将服务器的数据发送到客户端。Response对象的常用方法如下。</p>
	<p class="p3">（1）addCookie(Cookie cookie)</p>
	<p class="p3">该方法用于添加一个cookie对象以保存客户端的用户信息。示例：</p>
	<p class="p3"><pre class="pre1">
	&lt;%Cookie cookie= new Cookie("id","123");
	response.addCookie(cookie); %&gt;</pre></p>
	<p class="p3">（2）addHeader(String name，String value)</p>
	<p class="p3">该方法用于添加HTTP文件的头信息，设置的头信息将会被传送到客户端。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% response.addHeader("name", "123");%&gt;</pre></p>
	<p class="p3">（3）containsHeader(String name)</p>
	<p class="p3">该方法用于判断指定名字的HTTP文件头信息是否存在。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% boolean bj= response.containsHeader("name");%&gt;</pre></p>
	<p class="p3">（4）sendError(int num)</p>
	<p class="p3">该方法用于向客户端发送指定的错误信息。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% response.sendError(404);%&gt;</pre></p>
	<p class="p3">（5）sendRedirect(String URL)</p>
	<p class="p3">该方法用于进行页面的重定向。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% response.sendRedirect("www.baidu.com");%&gt;</pre></p>
	<p class="p3">（6）setContentType(String MIME)</p>
	<p class="p3">该方法用于设置响应的MIME类型。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% response.setContentType("text/html");%&gt;</pre></p>
	<p class="p3">（7）setHeader(String name，String value)</p>
	<p class="p3">该方法用于设置HTTP文件的头信息。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% response.setHeader("name", "123");%&gt;</pre></p>
	<p class="p3">（8）flushBuffer()</p>
	<p class="p3">该方法用于将当前缓冲区中的内容发送至请求客户端。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% response.flushBuffer();%&gt;</pre></p>
	<p class="p3">（9）getBufferSize()</p>
	<p class="p3">该方法用于获取缓冲区大小。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% int txt=response.getBufferSize();%&gt;</pre></p>
	<p class="p3">（10）setBufferSize(int num)</p>
	<p class="p3">该方法用于设置缓冲区大小，单位为字节。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% response.setBufferSize(8192);%&gt;</pre></p>
	<p class="p3">（11）getCharacterEncoding()</p>
	<p class="p3">该方法用于获取字符编码方式。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=response.getCharacterEncoding();%&gt;</pre></p>
	<p class="p3">（12）setCharacterEncoding(String value)</p>
	<p class="p3">该方法用于设置字符编码方式。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% response.setCharacterEncoding("utf-8");%&gt;</pre></p>
	<p class="p3">（13）setLocale(Local local)</p>
	<p class="p3">该方法用于设置本地国家和语言。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Locale locale=new Locale("ch");
	response.setLocale(locale);%&gt;</pre></p>
	<p class="p3">（14）getLocale()</p>
	<p class="p3">该方法用于获取本地国家和语言。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Locale locale= response.getLocale();%&gt;</pre></p>
	<p class="p3">（15）getOutputStream()</p>
	<p class="p3">该方法用于获取客户端的输出流对象。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% OutputStream outputStream= response.getOutputStream();%&gt;</pre></p>
	<p class="p3">（16）resetBuffer()和reset()</p>
	<p class="p3">resetBuffer方法用于清除响应中潜在的缓冲区的内容没有明确的标题或状态代码，reset方法用于清除所有的数据缓冲区中存在以及头状态代码。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% response.resetBuffer();
	response.reset();%&gt;</pre></p>
	<p class="p3">（17）getWriter()</p>
	<p class="p3">该方法用于获取PrintWriter。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Writer writer= response.getWriter();%&gt;</pre></p>
	<p class="p2"><a name="#text3-5-3"></a>3，Session对象</p>
	<p class="p2">Session对象用来保存每个用户在会话期间保持的数据信息，记录每个用户的访问状态以便跟踪每个用户的操作。Session对象的常用方法如下。</p>
	<p class="p3">（1）setAttribute(String name,Object obj)</p>
	<p class="p3">该方法用于设置指定名字的Session对象的值。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% session.setAttribute("name", "admin");%&gt;</pre></p>
	<p class="p3">（2）getAttribute(String name)</p>
	<p class="p3">该方法用于获取指定名字的Session对象的值。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% session.getAttribute("name");%&gt;</pre></p>
	<p class="p3">（3）getAttributeNames()</p>
	<p class="p3">该方法用于获取Session对象中所有属性的名称。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Enumeration&lt;String&gt; enu= session.getAttributeNames();%&gt;</pre></p>
	<p class="p3">（4）getCreationTime()</p>
	<p class="p3">该方法用于获取Session对象创建的时间，单位为毫秒。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% long time= session.getCreationTime();%&gt;</pre></p>
	<p class="p3">（5）getId()</p>
	<p class="p3">该方法用于获取Session对象在服务器上的唯一标识。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String id= session.getId();%&gt;</pre></p>
	<p class="p3">（6）getMaxInactiveInterval()</p>
	<p class="p3">该方法用于获取Session对象的有效时间，单位为毫秒。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% int time= session.getMaxInactiveInterval();%&gt;</pre></p>
	<p class="p3">（7）getLastAccessedTime()</p>
	<p class="p3">该方法用于获取客户端最后一次访问服务器端的时间，单位为毫秒。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% long time= session.getLastAccessedTime();%&gt;</pre></p>
	<p class="p3">（8）invalidate()</p>
	<p class="p3">该方法用于清除Session对象。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% session.invalidate();%&gt;</pre></p>
	<p class="p3">（9）isNew()</p>
	<p class="p3">该方法用于判断Session对象是否为一个新的Session对象。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% boolean bj= session.isNew();%&gt;</pre></p>
	<p class="p3">（10）removeAttribute(String name)</p>
	<p class="p3">该方法用于移除指定名字的Session对象的值。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% session.removeAttribute("name");%&gt;</pre></p>
	<p class="p3">（11）setMaxInactiveInterval(int time)</p>
	<p class="p3">该方法用于设置Session对象的有效时间，单位为毫秒。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% session.setMaxInactiveInterval(100000);%&gt;</pre></p>
	<p class="p3">（12）getServletContext()</p>
	<p class="p3">该方法用于获取Servlet视图。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% ServletContext context= session.getServletContext();%&gt;</pre></p>
	<p class="p3">（13）getSessionContext()</p>
	<p class="p3">该方法用于获取所有在服务器上的Session视图。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% HttpSessionContext context= session.getSessionContext();%&gt;</pre></p>
	<p class="p3">（13）getSessionContext()</p>
	<p class="p3">该方法用于获取所有在服务器上的Session视图。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% HttpSessionContext context= session.getSessionContext();%&gt;</pre></p>
	<p class="p2"><a name="#text3-5-4"></a>4，Application对象</p>
	<p class="p2">Application对象是个重要对象，同一个服务器中的所有JSP页面共享一个Application对象。Application对象的常用方法如下。</p>
	<p class="p3">（1）setAttribute(String name,Object obj)</p>
	<p class="p3">该方法用于设置指定名字的Application对象的值。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% application.setAttribute("name", "admin");%&gt;</pre></p>
	<p class="p3">（2）getAttribute(String name)</p>
	<p class="p3">该方法用于获取指定名字的Application对象的值。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% application.getAttribute("name");%&gt;</pre></p>
	<p class="p3">（3）removeAttribute(String name)</p>
	<p class="p3">该方法用于移除指定名字的Application对象的值。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% application.removeAttribute("name");%&gt;</pre></p>
	<p class="p3">（4）getAttributeNames()</p>
	<p class="p3">该方法用于获取Application对象中所有属性的名称。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Enumeration&lt;String&gt; enu= application.getAttributeNames();%&gt;</pre></p>
	<p class="p3">（5）setInitParameter(String name，String value)</p>
	<p class="p3">该方法用于设置指定名字的初始化参数。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% application.setInitParameter("name", "");%&gt;</pre></p>
	<p class="p3">（6）getInitParameter(String name)</p>
	<p class="p3">该方法用于获取指定名字的初始化参数。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=application.getInitParameter("name");%&gt;</pre></p>
	<p class="p3">（7）getServerInfo()</p>
	<p class="p3">该方法用于获取编译器Servlet当前的版本信息。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=application.getServerInfo();%&gt;</pre></p>
	<p class="p3">（8）getServlet(String name)</p>
	<p class="p3">该方法用于获取指定名字的Servlet。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Servlet servlet= application.getServlet("");%&gt;</pre></p>
	<p class="p3">（9）addListener(String name)和createListener(HttpSessionListener.class)</p>
	<p class="p3">addListener方法用于添加指定名字的监听器，createListener方法用于创建监听器。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% application.addListener("");
	application.createListener(HttpSessionListener.class);%&gt;</pre></p>
	<p class="p3">（10）addFilter()和createFilter()</p>
	<p class="p3">addFilter方法用于添加过滤器，createFilter方法用于创建过滤器。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% application.addFilter("", "");
	application.createFilter("");%&gt;</pre></p>
	<p class="p3">（11）addServlet()和createServlet()</p>
	<p class="p3">addServlet方法用于添加一个Servlet，createServlet方法用于创建Servlet。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% application.addServlet("", "");
	application.createServlet(Object.class);%&gt;</pre></p>
	<p class="p3">（12）log()</p>
	<p class="p3">该方法用于添加一个日志。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% application.log("");%&gt;</pre></p>
	<p class="p3">（13）还有一些方法，示例：</p>
	<p class="p3"><pre class="pre1">&lt;% SessionCookieConfig cookieConfig= application.getSessionCookieConfig();
	JspConfigDescriptor descriptor = application.getJspConfigDescriptor();
	Set&lt;SessionTracking&gt; sessionTrackings= application.getEffectiveSessionTrackingModes();
	FilterRegistration filter= application.getFilterRegistration("");
	ServletRegistration servlet= application.getServletRegistration("");
	InputStream inputStream= application.getResourceAsStream("");
	RequestDispatcher requestDispatcher= application.getRequestDispatcher("");%&gt;</pre></p>
	<p class="p2"><a name="#text3-5-5"></a>5，Config对象</p>
	<p class="p2">Config对象用来获取服务器的配置信息，是JSP页面进行初始化时提供的配置数据信息的对象，它能够方便WEB服务器的管理和维护。Config对象的常用方法如下。</p>
	<p class="p3">（1）getInitParameter(String name)</p>
	<p class="p3">该方法用于获取指定名字的初始化参数。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=config.getInitParameter("name");%&gt;</pre></p>
	<p class="p3">（2）getInitParameterNames()</p>
	<p class="p3">该方法用于获取所有的初始化参数名称。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% Enumeration&lt;String&gt; enu=config.getInitParameterNames();%&gt;</pre></p>
	<p class="p3">（3）getServletContext()</p>
	<p class="p3">该方法用于获取ServletContext(即Application)。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% ServletContext context=config.getServletContext();%&gt;</pre></p>
	<p class="p3">（4）getServletName()</p>
	<p class="p3">该方法用于获取Servlet的名称。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=config.getServletName();%&gt;</pre></p>
	<p class="p2"><a name="#text3-5-6"></a>6，Exception对象</p>
	<p class="p2">Exception对象用来处理JSP页面文件在执行时发生的错误和异常，用来显示异常信息，只有在包含isErrorPage="true"的页面才能使用。Exception对象的常用方法如下。</p>
	<p class="p3">（1）addSuppressed()</p>
	<p class="p3">该方法用于把一个异常加到另一个异常上。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% exception.addSuppressed(exception);%&gt;</pre></p>
	<p class="p3">（2）getMessage()</p>
	<p class="p3">该方法用于获取异常信息。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% String txt=exception.getMessage();%&gt;</pre></p>
	<p class="p3">（3）fillInStackTrace()</p>
	<p class="p3">在异常堆栈跟踪中填充。此方法在 Throwable 对象信息中记录有关当前线程堆栈帧的当前状态。</p>
	<p class="p3">（4）getCause()</p>
	<p class="p3">返回此 throwable 的 cause；如果 cause 不存在或未知，则返回 null。（该 Cause 是导致抛出此 throwable 的前面一级引发的throwable。） </p>
	<p class="p3">（5）getStackTrace()</p>
	<p class="p3">提供编程访问由 printStackTrace() 输出的堆栈跟踪信息。返回堆栈跟踪元素的数组，每个元素表示一个堆栈帧。数组的第零个元素（假定数据的长度为非零）表示堆栈顶部，它是序列中最后的方法调用。通常，这是创建和抛出该 throwable 的地方。数组的最后元素（假定数据的长度为非零）表示堆栈底部，它是序列中第一个方法调用。 </p>
	<p class="p3">（6）initCause(Throwable cause)</p>
	<p class="p3">将此 throwable 的 cause 初始化为指定值。此方法至多可以调用一次。此方法通常从构造方法中调用，或者在创建 throwable 后立即调用。如果此 throwable 通过 Throwable(Throwable) 或 Throwable(String,Throwable) 创建，此方法甚至一次也不能调用。 </p>
	<p class="p3">（7）printStackTrace()</p>
	<p class="p3">将此 throwable 及其追踪输出至标准错误流。此方法将此 Throwable 对象的堆栈跟踪输出至错误输出流，作为字段 System.err 的值。输出的第一行包含此对象的 toString() 方法的结果。剩余行表示以前由方法 fillInStackTrace() 记录的数据。</p>
	<p class="p3">（8）setStackTrace(StackTraceElement[] stackTrace)</p>
	<p class="p3">设置将由 getStackTrace() 返回，并由 printStackTrace() 和相关方法输出的堆栈跟踪元素。 此方法设计用于 RPC 框架和其他高级系统，允许客户端重写默认堆栈跟踪，这些默认堆栈跟踪要么在构造 throwable 时由 fillInStackTrace() 生成，要么在从序列化流读取 throwable 时反序列化。 </p>
	<p class="p2"><a name="#text3-5-7"></a>7，Out对象</p>
	<p class="p2">Out对象用来向客户端输出数据信息，其主要作用是在Web浏览器内输出信息。Out对象的常用方法如下。</p>
	<p class="p3">（1）append()</p>
	<p class="p3">该方法用于在Out对象末尾添加数据。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% out=(JspWriter)out.append("hello");%&gt;</pre></p>
	<p class="p3">（2）clear()</p>
	<p class="p3">该方法用于清除缓冲区数据，不把数据输出到客户端。</p>
	<p class="p3">（3）clearBuffer()</p>
	<p class="p3">该方法用于清除缓冲区数据，并把清除的数据输出到客户端。</p>
	<p class="p3">（4）close()</p>
	<p class="p3">该方法用于关闭输出流。</p>
	<p class="p3">（5）flush()</p>
	<p class="p3">该方法先把缓冲区数据输出到客户端，再清除缓冲区数据。</p>
	<p class="p3">（6）getBufferSize()</p>
	<p class="p3">该方法用于获取缓冲区大小。</p>
	<p class="p3">（7）getRemaining()</p>
	<p class="p3">该方法用于获取缓冲区中没有被使用的空间大小。</p>
	<p class="p3">（8）isAutoFlush()</p>
	<p class="p3">判断是否自动刷新，返回值为布尔变量。</p>
	<p class="p3">（9）newLine()</p>
	<p class="p3">输出一个换行符号。</p>
	<p class="p3">（10）print()</p>
	<p class="p3">用来输出各种数据到JSP页面。</p>
	<p class="p3">（11）println()</p>
	<p class="p3">用来换行后输出各种数据到JSP页面。</p>
	<p class="p3">（12）write()</p>
	<p class="p3">只能输出字符／字符数组／字符串/整形等相关的数据．。</p>
	<p class="p2"><a name="#text3-5-8"></a>8，Page对象</p>
	<p class="p2">Page对象是一个Object的实例。</p>
	<p class="p2"><a name="#text3-5-9"></a>9，PageContext对象</p>
	<p class="p2">PageContext对象用来获取JSP页面任何范围内的参数，通过PageContext对象可以获取JSP页面的Request，Response，Session，Out和Application等对象。PageContext对象的常用方法如下。</p>
	<p class="p3">（1）setAttribute(String name,Object obj)</p>
	<p class="p3">该方法用于设置指定名字的PageContext对象的值。示例：</p>
	<p class="p3"><pre class="pre1">&lt;% pageContext.setAttribute("name", "admin");%&gt;</pre></p>
	<p class="p3">（2）getAttribute(String name)</p>
	<p class="p3">该方法用于获取指定名字的PageContext对象的值。示例：</p>
	<p class="p3"><pre class="pre1">&lt;%  pageContext.getAttribute("name");%&gt;</pre></p>
	<p class="p3">（3）removeAttribute(String name)</p>
	<p class="p3">该方法用于移除指定名字的PageContext对象的值。示例：</p>
	<p class="p3"><pre class="pre1">&lt;%  pageContext.removeAttribute("name");%&gt;</pre></p>
	<p class="p3">（4）forward(String url)</p>
	<p class="p3">该方法用于将JSP页面重定向为另一个页面。示例：</p>
	<p class="p3"><pre class="pre1">&lt;%  pageContext.forward("www.baidu.com");%&gt;</pre></p>
	<p class="p3">（5）getAttributeNamesInScope(int num)</p>
	<p class="p3">该方法用于获取某个作用范围的参数名集合。示例：</p>
	<p class="p3"><pre class="pre1">&lt;%  Enumeration&lt;String&gt; enu=pageContext.getAttributeNamesInScope(1);%&gt;</pre></p>
	<p class="p3">（6）findAttribute(String name)</p>
	<p class="p3">该方法用于查找指定名字的所有域的值。示例：</p>
	<p class="p3"><pre class="pre1">&lt;%  pageContext.findAttribute("name");%&gt;</pre></p>
	<p class="p3">（7）include(String url)</p>
	<p class="p3">该方法用于把url名字的页面加入该JSP页面。示例：</p>
	<p class="p3"><pre class="pre1">&lt;%  pageContext.include("www.baidu.com");%&gt;</pre></p>
	<p class="p3">（8）获得各种对象。示例：</p>
	<p class="p3"><pre class="pre1">
	&lt;%  pageContext.getELContext();
	  pageContext.getErrorData();
	  pageContext.getException();
	  pageContext.getExpressionEvaluator();
	  pageContext.getOut();
	  pageContext.getPage();
	  pageContext.getRequest();
	  pageContext.getResponse();
	  pageContext.getServletConfig();
	  pageContext.getServletContext();
	  pageContext.getSession();
	  pageContext.getVariableResolver();%&gt;</pre></p>
	<p class="p1"><a name="text3-6"></a>六，JSP动作</p>
	<p class="p2">JSP动作是指JSP利用XML语法格式的标记来进行JSP页面的处理和控制，JSP动作可以动态的插入文件，重用JavaBean组建，重定向页面，从而完成对象的创建和使用。JSP动作包括：</p>
	<p class="p2">1，&lt;jsp: include&gt;动作</p>
	<p class="p3">include动作用来在JSP页面中插入文件，可以插入静态和动态的页面，其语法格式如下：</p>
	<p class="p3"><pre class="pre1">&lt;jsp:include page="index.jsp" flush="true/false"&gt;&lt;/jsp:include&gt;</pre></p>
	<p class="p3">其中参数page添加的是相对路径，可以是字符串也可以是一个表达式，参数flush为true是表示当缓冲区满时，缓冲区将被清空，默认为false。</p>
	<p class="p3">如果使用&lt;jsp: include&gt;在JSP页面传递参数，其语法格式为：</p>
	<p class="p3"><pre class="pre1">
	&lt;jsp:include page="index.jsp" flush="false"&gt;
		&lt;jsp:param value="admin" name="user" /&gt;
	&lt;/jsp:include&gt;</pre></p>
	<p class="p2">2，&lt;jsp: useBean&gt;动作</p>
	<p class="p3">useBean动作用来装载一个将在JSP页面中使用的JavaBean，JavaBean可以封装业务逻辑，使业务处理和页面显示分开进行，使用JavaBean有利于组件的重用和程序模块化设计。其语法格式如下：</p>
	<p class="p3">JavaBean文件<pre class="pre1">
	package com;
	public class Hello {
		private String txt;
		public String getTxt() {
			return txt;
		}
		public void setTxt(String txt) {
			this.txt = txt;
		}
	}</pre></p>
	<p class="p3">JSP文件<pre class="pre1">
	&lt;jsp:useBean id="hello" beanName="" class="com.Hello" scope="page" type="com.Hello"&gt;&lt;/jsp:useBean&gt;
	&lt;% hello.setTxt("hello"); %&gt;
	&lt;%=hello.getTxt() %&gt;</pre></p>
	<p class="p3">id：创建JavaBean的实例对象名称，对JavaBean进行引用，用来区分不同的JavaBean。</p>
	<p class="p3">class：使用new关键字以及class构造器从一个class中实例一个bean。</p>
	<p class="p3">scope="page | request | session | application"，Bean存在的范围以及id变量名的有效范围</p>
	<p class="p4">page - 你能在包含&lt;jsp:useBean&gt;元素的JSP文件以及此文件中的所有静态包含文件中使用Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。</p>
	<p class="p4">request - 你在任何执行相同请求的Jsp文件中使用Bean,直到页面执行完毕向客户端发回响应或转到另一个文件为止。你能够使用Request对象访问Bean,比如request.getAttribute(beanInstanceName)</p>
	<p class="p4">session - 从创建Bean开始，你就能在任何使用相同session的Jsp文件中使用Bean.这个Bean存在于整个Session生存周期内，任何在分享此Session的Jsp文件都能使用同一Bean.注意在你创建Bean的Jsp文件中&lt;% @ page %&gt;指令中必须指定session=true</p>
	<p class="p4">application - 从创建Bean开始，你就能在任何使用相同application的Jsp文件中使用Bean.这个Bean存在于整个application生存周期内，任何在分享此application的Jsp文件都能使用同一Bean.</p>
	<p class="p3">type：如果这个Bean已经在指定的范围中存在，那么给这个Bean一个新的数据类型 。如果你没有使用class或beanName指定type，Bean将不会被示例。</p>
	<p class="p3">beanName：使用java.beans.Beans.instantiate方法来从一个class或连续模版中实例一个Bean,同时指定Bean的类型。</p>
	<p class="p3">&lt;jsp: useBean&gt;动作通常和&lt;jsp: setProperty &gt;、&lt;jsp: getProperty &gt;一起使用。</p>
	<p class="p2">3，&lt;jsp: setProperty &gt;动作</p>
	<p class="p3">setProperty动作用来使用Bean给定的setter方法，在Bean中设置一个或多个属性值。其语法格式如下：</p>
	<p class="p3">JSP文件<pre class="pre1">
	&lt;jsp:useBean id="hello" class="com.Hello" scope="page" type="com.Hello"&gt;&lt;/jsp:useBean&gt;
	&lt;jsp:setProperty property="txt" name="hello" value="hello"/&gt;</pre></p>
	<p class="p3">其中各个属性如下：</p>
	<p class="p4">name：表示已经在&lt;jsp:useBean&gt;中创建的Bean实例的名字。</p>
	<p class="p4">property：表示JavaBean中的属性名。</p>
	<p class="p4">value：表示传给JavaBean属性的值。</p>
	<p class="p4">param：把request对象中的参数传给JavaBean，不能和value一起用。</p>
	<p class="p2">4，&lt;jsp: getProperty &gt;动作</p>
	<p class="p3">getProperty动作用来获取JavaBean的属性值。其语法格式如下：</p>
	<p class="p3"><pre class="pre1">
	&lt;jsp:useBean id="hello" class="com.Hello" scope="page" type="com.Hello"&gt;&lt;/jsp:useBean&gt;
	&lt;jsp:setProperty property="txt" name="hello" value="hello"/&gt;
	&lt;jsp:getProperty property="txt" name="hello"/&gt;</pre></p>
	<p class="p3">name：表示已经在&lt;jsp:useBean&gt;中创建的Bean实例的名字。</p>
	<p class="p3">property：表示JavaBean中的属性名。</p>
	<p class="p2">5，&lt;jsp: forward &gt;动作</p>
	<p class="p3">forward动作用来将当前请求转向另外的JSP页面、静态文件或一个Servlet。其语法格式如下：</p>
	<p class="p3"><pre class="pre1">
	&lt;jsp:forward page="index.jsp" &gt;&lt;/jsp:forward&gt;</pre></p>
	<p class="p3">如果使用&lt;jsp: forward&gt;在JSP页面传递参数，其语法格式为：</p>
	<p class="p3"><pre class="pre1">
	&lt;jsp:forward page="index.jsp" &gt;
		&lt;jsp:param value="admin" name="user" /&gt;
	&lt;/jsp:forward&gt;</pre></p>
	<p class="p3">其中参数page添加的是相对路径，可以是字符串也可以是一个表达式，param  name为参数名，value为参数值。</p>
	<p class="p2">5，&lt;jsp: plugin &gt;动作</p>
	<p class="p3">plugin动作用来在客户端的浏览器中显示一个对象，使JSP文件中嵌入一个Java程序，通常为applet或Bean。其语法格式如下：</p>
	<p class="p3"><pre class="pre1">
	&lt;jsp:plugin
	type="bean | applet"
	code="classFileName"
	codebase="classFileDirectoryName"
	[ name="instanceName" ]
	[ archive="URIToArchive, ..." ]
	[ align="bottom | top | middle | left | right" ]
	[ height="displayPixels" ]
	[ width="displayPixels" ]
	[ hspace="leftRightPixels" ]
	[ vspace="topBottomPixels" ]
	[ jreversion="JREVersionNumber | 1.1" ]
	[ nspluginurl="URLToPlugin" ]
	[ iepluginurl="URLToPlugin" ] &gt;
	[ &lt;jsp:params&gt;
	[ &lt;jsp:param name="parameterName" value="{parameterValue | &lt;%= expression %&gt;}" /&gt; ]+
	&lt;/jsp:params&gt; ]
	[ &lt;jsp:fallback&gt; text message for user &lt;/jsp:fallback&gt; ]
	&lt;/jsp:plugin&gt;</pre></p>
	<p class="p3">其中各个属性如下：</p>
	<p class="p4">type="bean | applet" : 将被执行的插件对象的类型，你必须得指定这个是Bean还是applet,因为这个属性没有缺省值.</p>
	<p class="p4">code="classFileName" : 将会被Java插件执行的Java Class的名字，必须以.class结尾。这个文件必须存在于codebase属性指定的目录中.</p>
	<p class="p4">codebase="classFileDirectoryName" : 将会被执行的Java Class文件的目录（或者是路径)，如果你没有提供此属性，那么使用&lt;jsp:plugin&gt;的jsp文件的目录将会被使用.</p>
	<p class="p4">name="instanceName" : 这个Bean或applet实例的名字，它将会在Jsp其它的地方调用.</p>
	<p class="p4">archive="URIToArchive, ..." : 一些由逗号分开的路径名，这些路径名用于预装一些将要使用的class,这会提高applet的性能.</p>
	<p class="p4">align="bottom | top | middle | left | right" : 图形，对象，Applet的位置.</p>
	<p class="p4">height="displayPixels" width="displayPixels" : Applet或Bean将要显示的长宽的值，此值为数字，单位为象素.</p>
	<p class="p4">hspace="leftRightPixels" vspace="topBottomPixels" : Applet或Bean显示时在屏幕左右，上下所需留下的空间，单位为象素.</p>
	<p class="p4">jreversion="JREVersionNumber | 1.2" : Applet或Bean运行所需的Java Runtime Environment (JRE) 的版本. 缺省值是 1.2.</p>
	<p class="p4">nspluginurl="URLToPlugin" ：Netscape Navigator用户能够使用的JRE的下载地址，此值为一个标准的URL。</p>
	<p class="p4">iepluginurl="URLToPlugin"　：IE用户能够使用的JRE的下载地址，此值为一个标准的URL。</p>
	<p class="p4">&lt;jsp:params&gt; [ &lt;jsp:param name="parameterName" value="{parameterValue | &lt;%= expression %&gt;}" /&gt; ]+ &lt;/jsp:params&gt;
你需要向applet或Bean传送的参数或参数值。</p>
	<p class="p4">&lt;jsp:fallback&gt; unable to start plugin &lt;/jsp:fallback&gt;当不能启动Applet 或Bean 时，提示的信息。</p>
	<p class="p2">6，用于标记文件的标准动作</p>
	<p class="p3">&lt;jsp: element &gt;动作，&lt;jsp: attribute &gt;动作，&lt;jsp: body &gt;动作和&lt;jsp:output&gt;动作</p>
	<p><strong class="font4"><a name="text4-1"></a>四，JSP自定义标签</strong></p>
	<p class="p1">自定义标签在功能上逻辑上与javaBean 类似,都封装Java 代码。自定义标签是可重用的组件代码，并且允许开发人员为复杂的操作提供逻辑名称。</p>
	<p class="p1">JSP开发人员使用标签库创建标签.标签库是按照功能或实现进行分组的自定义标签的集合。</p>
	<p class="p1">自定义标签由以下四个部分组成：</p>
	<p class="p1">1.标签(Tag):</p>
	<p class="p2">标签是一种XML元素，通过标签可以使JSP网页变得简洁并且易于维护，还可以方便地实现同一个JSP文件支持多种语言版本。由于标签是XML元素，所以它的名称和属性都是大小写敏感的。</p>
	<p class="p1">2.标签库(Tag library):</p>
	<p class="p2">由一系列功能相似、逻辑上互相联系的标签构成的集合称为标签库。</p>
	<p class="p1">3.标签库描述文件(Tag Library Descriptor):</p>
	<p class="p2">标签库描述文件是一个XML文件，这个文件提供了标签库中类和JSP中对标签引用的映射关系。它是一个配置文件，和web.xml是类似的。</p>
	<p class="p1">4.标签处理类(Tag Handle Class):</p>
	<p class="p2">标签处理类是一个Java类，这个类继承了TagSupport或者扩展了SimpleTag接口，通过这个类可以实现自定义JSP标签的具体功能。</p>
	<p class="p1">一般情况下开发jsp自定义标签需要引用以下两个包：</p>
	<p class="p2">import javax.servlet.jsp.*;</p>
	<p class="p2">import javax.servlet.jsp.tagext.*;</p>
	<p class="p1">首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP2.0中新引入的)。</p>
	<p class="p3"><img src="JSPTag.png"/></p>
	<p class="p1"><a name="text4-2"></a><b>目标1:自定义一个用表格显示用户信息的简单标签</b></p>
	<p class="p2"><table border=1><tr><td width=100>UserName:</td><td width=200>Xuwei</td></tr><tr><td >Age:</td><td >33</td></tr><tr><td>Email:</td><td >test@test.test</td></tr></table></p>
	<p class="p2">假设我们有一个UserInfo的javabean，那么在JSP页面使用此标签只需调用此标签即可</p>
	<p class="p3"><pre class="pre1">
&lt;!-- 创建需要展现UserInfo的实例（用于测试数据） --&gt;
    &lt;%
    UserInfo user = new UserInfo();
    user.setUserName("Xuwei");
    user.setAge(33);
    user.setEmail("test@test.test");
    pageContext.setAttribute("userinfo", user);  
    %&gt;
    &lt;!-- 给标签设置user属性绑定要展现的UserInfo对象  --&gt;
    &lt;cc:showUserInfo user="${pageScope.userinfo }" /&gt;</pre></p>
	<p class="p2">简单标签的开发我们只要实现Tag接口即可，为了简单起见可以直接继承实现了此接口的TagSupport类</p>
	<p class="p2">1 创建自定义标签类</p>
	<p class="p3"><pre class="pre1">
public class UserInfoTag extends TagSupport {

    private UserInfo user;

    @Override
    public int doStartTag() throws JspException {
        try {
            JspWriter out = this.pageContext.getOut();
            if(user == null) {
                out.println("No UserInfo Found...");
                return SKIP_BODY;
            }
            out.println("&lt;table width='500px' border='1' align='center'&gt;");
            out.println("&lt;tr&gt;");
            out.println("&lt;td width='20%'&gt;Username:&lt;/td&gt;");
            out.println("&lt;td&gt;" + user.getUserName() + "&lt;/td&gt;");
            out.println("&lt;/tr&gt;");
            out.println("&lt;tr&gt;");
            out.println("&lt;td&gt;Age:&lt;/td&gt;");
            out.println("&lt;td&gt;" + user.getAge() + "&lt;/td&gt;");
            out.println("&lt;/tr&gt;");
            out.println("&lt;tr&gt;");
            out.println("&lt;td&gt;Email:&lt;/td&gt;");
            out.println("&lt;td&gt;" + user.getEmail() + "&lt;/td&gt;");
            out.println("&lt;/tr&gt;");
            out.println("&lt;/table&gt;");
        } catch(Exception e) {
            throw new JspException(e.getMessage());
        }
        return SKIP_BODY;
    }

    @Override
    public int doEndTag() throws JspException {
        return EVAL_PAGE;
    }

    @Override
    public void release() {
        super.release();
        this.user = null;
    }   

    //getter and setters
    public UserInfo getUser() {
        return user;
    }

    public void setUser(UserInfo user) {
        this.user = user;
    }
}</pre></p>
	<p class="p2">2 在Web-Inf创建标签库描述文件.tdl(Tag Library Description)</p>
	<p class="p3"><pre class="pre1">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;

&lt;taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"&gt;

&lt;tlib-version&gt;1.0&lt;/tlib-version&gt;
&lt;jsp-version&gt;2.0&lt;/jsp-version&gt;
&lt;short-name&gt;cc&lt;/short-name&gt;
&lt;uri&gt;/mytaglib&lt;/uri&gt;

&lt;tag&gt;
    &lt;name&gt;showUserInfo&lt;/name&gt;
    &lt;tag-class&gt;com.mytags.UserInfoTag&lt;/tag-class&gt;
    &lt;body-content&gt;empty&lt;/body-content&gt;
    &lt;attribute&gt;
        &lt;name&gt;user&lt;/name&gt;
         &lt;required&gt;false&lt;/required&gt;
         &lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;
    &lt;/attribute&gt;
 &lt;/tag&gt;

&lt;/taglib&gt;;</pre></p>
	<p class="p2">3 配置web.xml</p>
	<p class="p3"><pre class="pre1">
&lt;jsp-config&gt;

    &lt;taglib&gt;
        &lt;taglib-uri&gt;/mytaglib&lt;/taglib-uri&gt;
        &lt;taglib-location&gt;/WEB-INF/mytaglib.tld&lt;/taglib-location&gt;
    &lt;/taglib&gt;

&lt;/jsp-config&gt;</pre></p>
	<p class="p2">4 在需要使用此标签的jsp页面头部引入</p>
	<p class="p3"><pre class="pre1">&lt;%@ taglib uri="/mytaglib" prefix="cc"%&gt;</pre></p>
	<p class="p2">5 使用（参照上面的使用步骤）</p>
	<p class="p2">此致，一个简单的JSP标签开发完成</p>
	<p class="p2">标签类说明：</p>
	<p class="p3"><img src="TagClass.png"/></p>
	<p class="p2">我们创建的UserInfoTag类继承了TagSupport类，而它又实现了Tag接口，Tag接口的生命周期由其所在的容器控制，如下：</p>
	<p class="p3">setPageContext()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将所在jsp页面的pageContext注入进来，目的是为了在后面的方法中可以访问到jsp页面对象的pageContext属性</p>
	<p class="p3">setParent()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置此标签的父标签</p>
	<p class="p3">setAttribute()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将标签中的属性注入到此class的属性，不需要自己实现但要提供属性的get与set方法</p>
	<p class="p3">doStartTag()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在开始标签属性设置后调用，如果返回SKIP_BODY则忽略标签之中的内容，如果返回EVAL_BODY_INCLUDE则将标签体的内容进行输出</p>
	<p class="p3">doEndTag()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在结束标签之前调用，返回SKIP_PAGE跳过整个jsp页面后面的输出，返回EVAL_PAGE执行页面余下部分</p>
	<p class="p3">release()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;生命周期结束时调用</p>
	<p class="p2"><font color="red">特别说明：</font>在tomcat4.1之后的版本中默认开启了标签缓冲池(websphere和weblogic并不会这么做)，所以执行完标签后并不会执行release()方法（_jspDestroy()时才释放），也就是说同一个jsp页面自定义标签不管使用多少次只会存在一个实例，但也并不是每一个标签都会为其创建一个缓冲池，要根据参数来判断，例如：</p>
	<p class="p3"><pre class="pre1">
&lt;cc:UserInfoTag user=”…” /&gt;

&lt;cc:UserInfoTag /&gt;</pre></p>
	<p class="p2">上面例子中由于参数不同就会创建两个标签缓冲池。</p>
	<p class="p2">这个问题可以通过设定tomcat的配置文件加以解决：</p>
	<p class="p2">在%tomcat%\conf\web.xml加入enablePooling参数，并设置为false（不缓存自定义标签）。</p>
	<p class="p3"><pre class="pre1">
&lt;init-param&gt;
  &lt;param-name&gt;enablePooling&lt;/param-name&gt;
  &lt;param-value&gt;false&lt;/param-value&gt;
&lt;/init-param&gt;</pre></p>
	<p class="p2">清空%tomcat%\conf\目录</p>
	<p class="p2">TagSupport类已经为我们实现并扩展了一些方法(比如在上述方法中我们可以直接使用pageContext对象，调用父标签getParent()等)，所以一般情况下我们只需重写doStartTag()，doEndTag() 即可</p>
	<p class="p2">TLD文件说明：</p>
	<p class="p3"><pre class="pre1">
&lt;!--版本号--&gt;
&lt;tlib-version&gt;1.0&lt;/tlib-version&gt;
&lt;jsp-version&gt;2.0&lt;/jsp-version&gt;
&lt;short-name&gt;cc&lt;/short-name&gt;
&lt;uri&gt;/mytaglib&lt;/uri&gt;

&lt;tag&gt;
&lt;!—指定标签名 --&gt;
    &lt;name&gt;showUserInfo&lt;/name&gt;
&lt;!—指定标签类文件的全路径 --&gt;
    &lt;tag-class&gt;com.mytags.UserInfoTag&lt;/tag-class&gt;
&lt;!--如果不需要标签体则设置empty，反之设定jsp --&gt;
    &lt;body-content&gt;empty&lt;/body-content&gt;

&lt;!—设定属性(如果有的话) --&gt;
    &lt;attribute&gt;
	&lt;!—指定标签名 --&gt;
	&lt;name&gt;user&lt;/name&gt;
	&lt;!—是否是必须，如果非必须没设置则为空 --&gt;
        &lt;required&gt;false&lt;/required&gt;
	&lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;&lt;!—是否可在属性中使用表达式 --&gt;
    &lt;/attribute&gt;

&lt;/tag&gt;;</pre></p>
	<p class="p2">Web.xml文件说明：</p>
	<p class="p3"><pre class="pre1">
&lt;jsp-config&gt;

    &lt;taglib&gt;
&lt;!--
标签库的uri路径
即jsp头文件中声明&lt;%@ taglib uri="/mytaglib" prefix="cc"%&gt;
的uri
 --&gt;
	&lt;taglib-uri&gt;/mytaglib&lt;/taglib-uri&gt;
	&lt;!—tld文件所在的位置--&gt;
        &lt;taglib-location&gt;/WEB-INF/mytaglib.tld&lt;/taglib-location&gt;
    &lt;/taglib&gt;

&lt;/jsp-config&gt;</pre></p>
	<p class="p1"><a name="text4-3"></a><b>目标2:开发带标签体的标签</b></p>
	<p class="p2">要开发带标签体的标签，可实现BodyTag，也可从BodyTag接口的实现类BodyTagSupport继承，为简化开发，推荐从BodyTagSupport类继承开发。</p>
	<p class="p2">编写标签对应的实现类时，需要重载BodyTagSupport类几个方法：doStartTag（）， setBodyContent（）， doInitBody（）， doAfterBody（）， doEndaTag（），他们执行顺序如下：doStartTag（）→doInitBody（）→setBodyContent（）→doAfterBody（）→doEndTag（）doStartTag（）方法可返回EVAL_BODY_INCLUDE或SKIP_BODY，如果返回EVAL_BODY_ INCLUDE则继续执行；如果返回SKIP_BODY则接下来的doInitBody（），setBodyContent（）， doAfterBody（）三个方法不会被执行，而直接执行doEndTag（）方法。</p>
	<p class="p2">setBodyContent（）方法用于设置标签体内容，如果在此之前要作一些初始化工作，则在doInitBody（）方法中完成。标签体内容执行完后，会调用doAfterBody（）方法，此方法可返回EVAL_BODY_TAG， SKIP_BODY。</p>
	<p class="p2">EVAL_PAGE或SKIP_PAGE.如果返回EVAL_BODY_TAG则会再次设置标签体内容，直到返回SKIP_BODY；如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分；如果返回SKIP_PAGE，则JSP页面的后续内容将不再执行。</p>
	<p class="p2">开发带标签体的标签：bodyTag1</p>
	<p class="p3">本实例将要开发一个带标签体的标签bodyTag1，这个标签有一个属性countNum，用于设置输出标签体内容的次数，输出内容为当前的系统时间。</p>
	<p class="p3">（1）第一步：开发标签实现类。</p>
	<p class="p4"><pre class="pre1">
	　　import javax.servlet.jsp.JspWriter;
	　　import javax.servlet.jsp.tagext.BodyTagSupport;
	　　public class bodyTag1 extends BodyTagSupport{
		private int countNum=0;//循环显示时间的次数
		private int currentNum=1;//当前执行次数
		//----标签开始时调用此方法-------
	   　public int doStartTag(){
			try{
				JspWriter out=pageContext.getOut();
				out.print("标签开始了:&lt;br&gt;");
				if(countNum&gt;0)
					return EVAL_BODY_TAG;
				else
					return SKIP_BODY;
			}catch(Exception e){
				System.out.println(e);
				return SKIP_BODY;
			}
		}
		//----标签体执行完后调用此方法----
		public int doAfterBody(){
			try{
			 JspWriter out=pageContext.getOut();
			 out.print("第"+currentNum+"次执行标签体。标签体执行完毕。&lt;br&gt;");
			 if(countNum&gt;1){//如果还需要执行标签体
				 countNum--;
				 currentNum++;
				 return EVAL_BODY_TAG;
			 }else return SKIP_BODY;
			}catch(Exception e){
				System.out.println(e);
				return SKIP_BODY;
			}
		}
		//----标签结束时调用此方法-------
		public int doEndTag(){
			try{
				JspWriter out=pageContext.getOut();
				//----输出标签体的内容----
				bodyContent.writeOut(bodyContent.getEnclosingWriter());
				out.print("标签结束了。");
			}catch(Exception e){
				System.out.println(e);
			}
			return EVAL_PAGE;
		}
		public int getCountNum() {
			return countNum;
		}
		public void setCountNum(int countNum) {
			this.countNum = countNum;
			this.currentNum=1;
	  　　  }
	　　}</pre></p>
	<p class="p3">执行标签体并不会直接输出标签体中的内容，因此本实例在doEndTag（）方法中一次性把执行的结果输出。</p>
	<p class="p3">（2）第二步：编写标签描述tld文件。</p>
	<p class="p3">由于目标1种已经创建了此文件，我们只需增加此标签的配置即可</p>
	<p class="p4"><pre class="pre1">
&lt;!-- bodyTag1--&gt;
&lt;tag&gt;
  &lt;!-- 标签名称--&gt;
  &lt;name&gt;bodyTag1&lt;/name&gt;
  &lt;!-- 标签对应的处理类--&gt;
  &lt;tag-class&gt;com.mytags.bodyTag1&lt;/tag-class&gt;
  &lt;!-- 标签体内容,有标签体则设为jsp--&gt;
  &lt;body-content&gt;jsp&lt;/body-content&gt;
  &lt;!-- 标签的属性声明--&gt;
  &lt;attribute&gt;
   &lt;name&gt;countNum&lt;/name&gt;
   &lt;required&gt;true&lt;/required&gt;
   &lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;
  &lt;/attribute&gt;
&lt;/tag&gt;</pre></p>
	<p class="p3">对于属性countNum的声明中，&lt;required&gt;设置为true，表示此属性为必输项；&lt;rtexprvalue&gt;设置为true，表示标签体支持运行时的表达式取值，如果为false则表示标签体为一个静态文本，默认情况下设置为true.</p>
	<p class="p3">（3）第三步：在Web应用的web.xml文件中声明标签库引用。（目标1中已完成，无需修改）</p>
	<p class="p3">（4）第四步：在JSP页面中声明并调用标签。</p>
	<p class="p4"><pre class="pre1">
    &lt;%@ taglib uri="/mytaglib" prefix="cc" %&gt;
　　&lt;%@ page contentType="text/html;charset=GB2312" %&gt;
　　&lt;%@ page import="java.util.Date" %&gt;
　　&lt;html&gt;
  　　&lt;head&gt;
  　　&lt;title&gt;开发带有标签体的标签&lt;/title&gt;
  　　&lt;/head&gt; 
  　　&lt;body&gt;
      &lt;br&gt;
      &lt;cc:bodyTag1 countNum="6"&gt;
      现在的时间是：&lt;%=new Date()%&gt;&lt;br&gt;
      &lt;/cc:bodyTag1&gt;
 　　 &lt;/body&gt;
　　&lt;/html&gt;</pre></p>
	<p class="p1"><a name="text4-4"></a><b>目标3:开发迭代的标签</b></p>
	<p class="p2">效果：</p>
	<p class="p3"><table border=1><tr><td width=100>UserName:</td><td width=100>Age</td><td width=200>Email</td></tr><tr><td>Zhangsan</td><td>12</td><td >Zhangsan@163.com</td></tr><tr><td>Lisi</td><td>22</td><td >Lisi@sina.com</td></tr><tr><td>Wangwu</td><td>33</td><td >Wangwu@qq.com</td></tr></table></p>
	<p class="p2">在jsp页面使用此自定义标签：</p>
	<p class="p4"><pre class="pre1">
&lt;!-- 创建需要展现javabean（UserInfo）集合的实例（用于测试数据） --&gt;

&lt;%
    List&lt;UserInfo&gt; users = new ArrayList&lt;UserInfo&gt;();   
    users.add(new UserInfo("Zhangsan", 12, "Zhangsan@163.com"));
    users.add(new UserInfo("Lisi", 22, "Lisi@sina.com"));
    users.add(new UserInfo("Wangwu", 33, "Wangwu@qq.com"));
    pageContext.setAttribute("users", users);
%&gt;

&lt;!-- 给标签绑定数据源  --&gt;
&lt;table width='500px' border='1' align='center'&gt;

    &lt;tr&gt;
        &lt;td width='20%'&gt;UserName&lt;/td&gt;
        &lt;td width='20%'&gt;Age&lt;/td&gt;
        &lt;td&gt;Email&lt;/td&gt;
    &lt;/tr&gt;

    &lt;cc:repeater var="item" items="${pageScope.users }"&gt;
        &lt;tr&gt;
            &lt;td&gt;${item.userName }&lt;/td&gt;
            &lt;td&gt;${item.age }&lt;/td&gt;
            &lt;td&gt;${item.email }&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/cc:repeater&gt;

&lt;/table&gt;</pre></p>
	<p class="p2">要完成此控件我们需要实现一个迭代接口，即IterationTag，由于TagSupport同样实现了此接口，所以我们继承此类</p>
	<p class="p2">1 创建自定义标签类</p>
	<p class="p4"><pre class="pre1">
public class Repeater extends TagSupport {

    private Collection items;
    private Iterator it;
    private String var;

    @Override
    public int doStartTag() throws JspException {
        if(items == null || items.size() == 0) return SKIP_BODY;
        it = items.iterator();  
        if(it.hasNext()) {
            pageContext.setAttribute(var, it.next());
        }
        return EVAL_BODY_INCLUDE;
    }

    @Override
    public int doAfterBody() throws JspException {
        if(it.hasNext()) {
            pageContext.setAttribute(var, it.next());
            return EVAL_BODY_AGAIN;
        }
        return SKIP_BODY;
    }

    @Override
    public int doEndTag() throws JspException {
        return EVAL_PAGE;
    }

    public void setItems(Collection items) {
        this.items = items;
    }

    public void setVar(String var) {
        this.var = var;
    }

}</pre></p>
	<p class="p2">2 在Web-Inf创建标签库描述文件.tdl(Tag Library Description)</p>
	<p class="p2">由于目标1种已经创建了此文件，我们只需增加此标签的配置即可</p>
	<p class="p4"><pre class="pre1">
&lt;tag&gt;

    &lt;name&gt;repeater&lt;/name&gt;
    &lt;tag-class&gt;com.mytags.Repeater&lt;/tag-class&gt;
    &lt;body-content&gt;jsp&lt;/body-content&gt;

    &lt;attribute&gt;
        &lt;name&gt;items&lt;/name&gt;
        &lt;required&gt;false&lt;/required&gt;
        &lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;
    &lt;/attribute&gt;

    &lt;attribute&gt;
        &lt;name&gt;var&lt;/name&gt;
        &lt;required&gt;true&lt;/required&gt;
        &lt;rtexprvalue&gt;true&lt;/rtexprvalue&gt;
    &lt;/attribute&gt;

 &lt;/tag&gt;</pre></p>
	<p class="p2">3 配置web.xml （目标1中已完成，无需修改）</p>
	<p class="p2">4 在需要使用此标签的jsp页面头部引入</p>
	<p class="p4"><pre class="pre1">&lt;%@ taglib uri="/mytaglib" prefix="cc"%&gt;</pre></p>
	<p class="p2">5 使用（参照上面的使用步骤）</p>
	<p class="p1"><a name="text4-5"></a><b>目标4:自定义的函数库</b></p>
	<p class="p2">1 创建函数库类</p>
	<p class="p4"><pre class="pre1">
public class MyFunctions {

    public static String formatMyName(String name) {
       return "your name is " + name;
    }

    public static int add(int a, int b) {
       return a+b;
    }

}</pre></p>
	<p class="p2">2 在TLD文件中配置 (引用于目标1中的tld文件)</p>
	<p class="p4"><pre class="pre1">
&lt;function&gt;
    &lt;name&gt;formatMyName&lt;/name&gt;
    &lt;function-class&gt;com.taglib.MyFunctions&lt;/function-class&gt;
    &lt;function-signature&gt;java.lang.String formatMyName(java.lang.String)&lt;/function-signature&gt;
&lt;/function&gt;

&lt;function&gt;
    &lt;name&gt;add&lt;/name&gt;
    &lt;function-class&gt;com.taglib.MyFunctions&lt;/function-class&gt;
    &lt;function-signature&gt;java.lang.String add(int, int)&lt;/function-signature&gt;
&lt;/function&gt;</pre></p>
	<p class="p2">3 JSP中调用</p>
	<p class="p4"><pre class="pre1">
	${cc:formatMyName("wangfei") }
	${cc:add(12, 34) }</pre></p>
	<p><strong class="font4"><a name="text5"></a>五，网页错误代码</strong></p>
	<p class="p4"><pre class="pre1">
1**：请求收到，继续处理 
2**：操作成功收到，分析、接受 
3**：完成此请求必须进一步处理 
4**：请求包含一个错误语法或不能完成 
5**：服务器执行一个完全有效请求失败
100——客户必须继续发出请求 
101——客户要求服务器根据请求转换HTTP协议版本
200——交易成功 
201——提示知道新文件的URL 
202——接受和处理、但处理未完成 
203——返回信息不确定或不完整 
204——请求收到，但返回信息为空 
205——服务器完成了请求，用户代理必须复位当前已经浏览过的文件 
206——服务器已经完成了部分用户的GET请求
300——请求的资源可在多处得到 
301——删除请求数据 
302——在其他地址发现了请求数据 
303——建议客户访问其他URL或访问方式 
304——客户端已经执行了GET，但文件未变化 
305——请求的资源必须从服务器指定的地址得到 
306——前一版本HTTP中使用的代码，现行版本中不再使用 
307——申明请求的资源临时性删除
400——错误请求，如语法错误 
401——请求授权失败 
402——保留有效ChargeTo头响应 
403——请求不允许 
404——没有发现文件、查询或URl 
405——用户在Request-Line字段定义的方法不允许 
406——根据用户发送的Accept拖，请求资源不可访问 
407——类似401，用户必须首先在代理服务器上得到授权 
408——客户端没有在用户指定的饿时间内完成请求 
409——对当前资源状态，请求不能完成 
410——服务器上不再有此资源且无进一步的参考地址 
411——服务器拒绝用户定义的Content-Length属性请求 
412——一个或多个请求头字段在当前请求中错误 
413——请求的资源大于服务器允许的大小 
414——请求的资源URL长于服务器允许的长度 
415——请求资源不支持请求项目格式 
416——请求中包含Range请求头字段，在当前请求资源范围内没有range指示值，请求 
也不包含If-Range请求头字段 
417——服务器不满足请求Expect头字段指定的期望值，如果是代理服务器，可能是下 
一级服务器不能满足请求
500——服务器产生内部错误 
501——服务器不支持请求的函数 
502——服务器暂时不可用，有时是为了防止发生系统过载 
503——服务器过载或暂停维修 
504——关口过载，服务器使用另一个关口或服务来响应用户，等待时间设定值较长 
505——服务器不支持或拒绝支请求头中指定的HTTP版本 </pre></p>
	<p class="p1">使用web.xml来定义错误页面</p>
	<p class="p4"><pre class="pre1">
&lt;error-page&gt;
	&lt;error-code&gt;400&lt;/error-code&gt;
	&lt;location&gt;/400.html&lt;/location&gt;
&lt;/error-page&gt;

&lt;error-page&gt;
	&lt;error-code&gt;404&lt;/error-code&gt;
	&lt;location&gt;/404.html&lt;/location&gt;
&lt;/error-page&gt;

&lt;error-page&gt;
	&lt;error-code&gt;500&lt;/error-code&gt;
	&lt;location&gt;/error.jsp&lt;/location&gt;
&lt;/error-page&gt;</pre></p>
 </BODY>
</HTML>
